package javacommon.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreemarkerUtils {
	
	
	private static  Configuration Freemarker_cfg = null;

	public static void main(String[] args) {
		try {
			FreemarkerUtils test = new FreemarkerUtils();
			Map root = new HashMap();
			root.put("name", "-----------");
			root.put("msg", "-----------");
			String sGeneFilePath = FreemarkerUtils.class.getResource("/").getPath();
			//String sGeneFilePath = Thread.currentThread().getContextClassLoader().getResource("./").getPath();
			String sFileName = "test1.html";
			boolean bOK = test.geneHtmlFile("test.ftl", root, sGeneFilePath,
					sFileName);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * 获取Freemarker的配置. Freemarker本身支持classpath,目录和从ServletContext获取.
	 */
	protected static Configuration getFreemarkerCFG() {
		if (null == Freemarker_cfg) {
			Freemarker_cfg = new Configuration();
			// - Freemarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等
			// htmlskin是放在classpath下的一个目录
			Freemarker_cfg.setClassForTemplateLoading(FreemarkerUtils.class,
					"/templates");
			//Freemarker_cfg.setEncoding(Locale.getDefault(), "UTF-8");
			Freemarker_cfg.setDefaultEncoding("UTF-8");
		}
		return Freemarker_cfg;
	}

	/**
	 * 生成静态文件.
	 * 
	 * @param templateFileName
	 *            模板文件名,相对htmlskin路径,例如"/tpxw/view.ftl"
	 * @param propMap
	 *            用于处理模板的属性Object映射
	 * @param htmlFilePath
	 *            要生成的静态文件的路径,相对设置中的根路径,例如 "/tpxw/1/2005/4/"
	 * @param htmlFileName
	 *            要生成的文件名,例如 "1.htm"
	 */
	public static boolean geneHtmlFile(String templateFileName, Map propMap,
			String htmlFilePath, String htmlFileName) {
		// 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用
		//String sRootDir = "e:/webtest/htmlfile";
		try {
			Template t = getFreemarkerCFG().getTemplate(templateFileName);
			// 如果根路径存在,则递归创建子目录
			//creatDirs(sRootDir, htmlFilePath);
			t.setEncoding("UTF-8");
			File afile = new File( htmlFilePath + "/"
					+ htmlFileName);
			Writer out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(afile),"UTF-8"));
			t.process(propMap, out);
		} catch (TemplateException e) {
			// logger.error("Error while processing Freemarker template " +
			// templateFileName,e);
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			// logger.error("Error while generate Static Html File " +
			// htmlFileName,e);
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 创建多级目录
	 * 
	 * @param aParentDir
	 *            String
	 * @param aSubDir
	 *            以 / 开头
	 * @return boolean 是否成功
	 */
	public static boolean creatDirs(String aParentDir, String aSubDir) {
		File aFile = new File(aParentDir);
		if (aFile.exists()) {
			File aSubFile = new File(aParentDir + aSubDir);
			if (!aSubFile.exists()) {
				return aSubFile.mkdirs();
			} else {
				return true;
			}
		} else {
			return false;
		}
	}


}
